#ifndef XABSTRACTSYNTAXTREEVISITOR_H
#define XABSTRACTSYNTAXTREEVISITOR_H
#include <xscript/xabstractsyntaxtree.h>
#include <xscript/xprint.h>

class XAbstractSyntaxTreeVisitor
{
public:
    virtual ~XAbstractSyntaxTreeVisitor() = default;
public:
    void visit(std::shared_ptr<XAbstractSyntaxTree> tree);
public:
    virtual void visitInt(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitString(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitBoolean(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitFloat(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitVariable(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitValue(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitGreate(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitGreateOrEqual(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitLess(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitLessOrEqual(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitEqual(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitNot(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitAnd(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitOr(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitBlock(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitIf(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitElse(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitFor(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitWhile(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitFunction(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitPrint(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitLet(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitSet(std::shared_ptr<XAbstractSyntaxTree> tree);

    virtual void visitBreak(std::shared_ptr<XAbstractSyntaxTree> tree);
    virtual void visitReturn(std::shared_ptr<XAbstractSyntaxTree> tree);
};

#endif // XABSTRACTSYNTAXTREEVISITOR_H
